package arffreader;

import java.io.*;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main (String args[]) throws IOException, Exception{
        //PruebaArffReader();
        //PruebaArffCombineRows();
        //PruebaHashHeader();
        //PruebaKMeansCentroidReader();
        //PruebaReadLine();
        //PruebaEuclidea();
        //PruebaDecisiones();
        //PruebaCopiarCabecera();
        //PruebaAddAttribute();
        PruebaQLearning();

    }
    public static void PruebaArffReader() {
        ArffReader ar = new ArffReader();
        //Preprogramados
        List<String> valoresSet1 = ar.ObtenerColumnaFichero("/Users/okrmartin/Dropbox/AAutomatico/ejercicio10tutorial0/EstadoLogsAgenteEquipo1.arff", 66);
        List<String> valoresSet2 = ar.ObtenerColumnaFichero("/Users/okrmartin/Dropbox/AAutomatico/ejercicio10tutorial0/EstadoLogsAgenteEquipo2.arff", 66);
        List<String> valoresSet3 = ar.ObtenerColumnaFichero("/Users/okrmartin/Dropbox/AAutomatico/ejercicio10tutorial0/EstadoLogsAgenteEquipo3.arff", 66);

        //Aleatorios
        List<String> valoresSet4 = ar.ObtenerColumnaFichero("/Users/okrmartin/Dropbox/AAutomatico/ejercicio10tutorial0/EstadoLogsAgenteEquipo4.arff", 66);
        List<String> valoresSet5 = ar.ObtenerColumnaFichero("/Users/okrmartin/Dropbox/AAutomatico/ejercicio10tutorial0/EstadoLogsAgenteEquipo5.arff", 66);
        List<String> valoresSet6 = ar.ObtenerColumnaFichero("/Users/okrmartin/Dropbox/AAutomatico/ejercicio10tutorial0/EstadoLogsAgenteEquipo6.arff", 66);

        double suma = 0;
        double promedio = 0;
        double promedioPreprogramado = 0;
        double promedioAleatorio = 0;
        //Conjunto 1
        for (int i = 0; i< valoresSet1.size(); i++){
            suma += Double.parseDouble(valoresSet1.get(i));
        }
        promedio = suma / valoresSet1.size();

        suma = 0;
        for (int i = 0; i < valoresSet2.size(); i++){
            suma += Double.parseDouble(valoresSet2.get(i));
        }
        promedio += suma / valoresSet2.size();

        suma = 0;
        for (int i = 0; i < valoresSet3.size(); i++){
            suma += Double.parseDouble(valoresSet3.get(i));
        }
        promedio += suma / valoresSet3.size();

        promedioPreprogramado = promedio / 3;
        System.out.println(Double.toString(promedioPreprogramado));

        promedio = 0;
        suma = 0;
        for (int i = 0; i < valoresSet4.size(); i++){
            suma += Double.parseDouble(valoresSet4.get(i));
        }
        promedio = suma / valoresSet4.size();

        suma = 0;
        for (int i = 0; i < valoresSet5.size(); i++){
            suma += Double.parseDouble(valoresSet5.get(i));
        }
        promedio += suma / valoresSet5.size();

        suma = 0;
        for (int i = 0; i < valoresSet6.size(); i++){
            suma += Double.parseDouble(valoresSet6.get(i));
        }
        promedio += suma / valoresSet6.size();

        promedioAleatorio = promedio / 3;
        System.out.println(Double.toString(promedioAleatorio));

    }

    public static void PruebaArffCombineRows(){
        ArffCombineRows cr = new ArffCombineRows();
        try {
            cr.AppendNextColumn("/Users/Okr/Desktop/EstadoDecisiones.arff", "/Users/Okr/Desktop/NueavoArchivo.arff",0);
            //cr.AppendNextColumn("/Users/okrmartin/Dropbox/AAutomatico/DatosEjercicio2Tutorial2/EstadoDecisionesLogAgenteEquipo1.arff", 0);
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void PruebaHashHeader()
    {
        File archivo = null;
        FileReader fr = null;
        BufferedReaderArff br = null;

        int posicion;
        String str;

        archivo = new File("/Users/okrmartin/Dropbox/AAutomatico/code/data/EstadoDecisiones.arff");
        try
        {
            /*Lectura*/
            fr = new FileReader(archivo);
            br = new BufferedReaderArff(fr);

            posicion = br.getPosAttr("numeroPeriodo");
            System.out.println(posicion);
            str = br.readLineAttr("numeroPeriodo");
            System.out.println(str);
            
            posicion = br.getPosAttr("rbai");
            System.out.println(posicion);
            str = br.readLineAttr("rbai");
            System.out.println(str);

            posicion = br.getPosAttr("rcapinst");
            System.out.println(posicion);
            str = br.readLineAttr("rcapinst");
            System.out.println(str);
        }
        catch (FileNotFoundException ex)
        {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public static void PruebaKMeansCentroidReader() throws IOException{
        double basura[];
        try {
            File archivo = null;
            FileReader fr = null;
            BufferedReader br = null;
            KMeansCentroidsReader centroids = new KMeansCentroidsReader("/Users/okrmartin/Desktop/centroides.txt");
            basura = centroids.getEstado(9);
            for(int i = 0; i < basura.length; i++){
                System.out.print(" "+ basura[i] +" ");
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void PruebaReadLine() {
        File archivo = null;
        FileReader fr = null;
        BufferedReaderArff br = null;
        String linea = null;

        try
        {
            archivo = new File("/Users/Okr/Dropbox/AAutomatico/code/vistacluster.arff");
            fr = new FileReader(archivo);
            br = new BufferedReaderArff(fr);
            linea = br.readLine("Cluster", "cluster1");
            System.out.println(linea);
            linea = br.readLine("Cluster", "cluster1");
            System.out.println(linea);

        } 
        catch (FileNotFoundException ex)
        {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public static void PruebaEuclidea(){
        double[] a = {2, 1, 5};
        double[] b = {4, 3, 7};
        double d = MathTool.euclidea(a, b);
        System.out.println(d);
    }

    public static void PruebaDecisiones() throws FileNotFoundException{
            //Dentro del cluster se busca el RBAINEXT mayor y nos quedamos
            // con la linea que lo contiene
            File archivo = new File("/Users/Okr/Dropbox/AAutomatico/code/vistacluster.arff");
            FileReader fr = new FileReader(archivo);
            BufferedReaderArff br = new BufferedReaderArff(fr);

            String attrValue = "cluster1";
            String linea = br.readLine("Cluster", attrValue);

            String[] vstring = linea.split(",");
            String[] vstringTemp = vstring;

            int posRbaiNext = br.getPosAttr("rbainext");
            int posRbai = br.getPosAttr("rbai");
            double RBAINextTemp = Double.valueOf(vstring[posRbaiNext]);
            double RBAItemp = Double.valueOf(vstring[posRbai]);

            //vstringTemp contendra la linea con mayor RBAINEXT del cluster correspondiente
            while ((linea = br.readLine("Cluster", attrValue)) != null) {
                vstring = linea.split(",");

                //Las decisiones que tomó incrementaron RBAI
                if (Double.valueOf(vstring[posRbaiNext]) > Double.valueOf(vstring[posRbai]))
                {
                    // Nos quedamos con la decision que más aumento el rbai
                    if (Double.valueOf(vstring[posRbaiNext]) > RBAINextTemp)
                    {
                        RBAINextTemp = Double.valueOf(linea.split(",")[posRbaiNext]);
                        vstringTemp = vstring;
                    }
                }
            }

            // DINFCOMER
            double dinfcomer = Double.valueOf(vstringTemp[br.getPosAttr("dinfcomer")]);

            // DPRECIOEMP
            double dprecioemp = Double.valueOf(vstringTemp[br.getPosAttr("dprecioemp")]);

            // DPUBLICIDA
            double dpublicida = Double.valueOf(vstringTemp[br.getPosAttr("dpublicida")]);

            // DPROMRED
            double dpromred = Double.valueOf(vstringTemp[br.getPosAttr("dpromred")]);

            double damplrrhh = Double.valueOf(vstringTemp[br.getPosAttr("damplrrhh")]);
            double dredrrhh = Double.valueOf(vstringTemp[br.getPosAttr("dredrrhh")]);

            // DFORMACION
            double dformacion = Double.valueOf(vstringTemp[br.getPosAttr("dformacion")]);

            double dampcap = Double.valueOf(vstringTemp[br.getPosAttr("dampcap")]);

            // DCOMPRAMP
            double dcompramp = Double.valueOf(vstringTemp[br.getPosAttr("dcompramp")]);

            // DPRODPROG
            double dprodprog = Double.valueOf(vstringTemp[br.getPosAttr("dprodprog")]);
            double dredcap = Double.valueOf(vstringTemp[br.getPosAttr("dredcap")]);

            double rpreciocom = Double.valueOf(vstringTemp[br.getPosAttr("rpreciocom")]);
            // DID
            double did = Double.valueOf(vstringTemp[br.getPosAttr("did")]);

            // DPRESTAMO Y DPLAZOPRES
            double dprestamo = Double.valueOf(vstringTemp[br.getPosAttr("dprestamo")]);
            double dplazopres = Double.valueOf(vstringTemp[br.getPosAttr("dplazopres")]);
            double dactfinco = Double.valueOf(vstringTemp[br.getPosAttr("dactfinco")]);
            double dactfinvta = Double.valueOf(vstringTemp[br.getPosAttr("dactfinvta")]);
            double dcomprapla = Double.valueOf(vstringTemp[br.getPosAttr("dcomprapla")]);
            double daccemi = Double.valueOf(vstringTemp[br.getPosAttr("daccemi")]);
            double dprecemi = Double.valueOf(vstringTemp[br.getPosAttr("dprecemi")]);
            double ddivbene = Double.valueOf(vstringTemp[br.getPosAttr("ddivbene")]);
            double ddivres = Double.valueOf(vstringTemp[br.getPosAttr("ddivres")]);
    }
    
    public static void PruebaCopiarCabecera() throws IOException {
        File archivoLectura = null;
        File archivoEscritura = null;
        HeaderCopier hCopier = new HeaderCopier();

        hCopier.CopiaCabecera("/Users/Okr/Desktop/vista.arff", "/Users/Okr/Desktop/header.arff");
    }
    
    public static void PruebaAddAttribute() throws Exception{
   
        File archivoLectura = null;
        File archivoEscritura = null;
        HeaderInserter hInserter = new HeaderInserter();

        hInserter.addAttributte("basura3", "real" ,"/Users/Okr/Desktop/header.arff");
    }

    private static void PruebaQLearning() {
        double[][] tuplas = {
            {0, 1, 1, 0}, {0, 2, 5, 0},
            {1, 1, 2, 0}, {1, 2, 6, 0}, {1, 3, 0, 0},
            {2, 1, 3, 0}, {2, 3, 1, 0},
            {3, 1, 4, 0}, {3, 2, 7, 0}, {3, 3, 2, 0},
            {4, 3, 3, 0},
            {5, 0, 0, 0}, {5, 1, 6, 0}, {5, 2, 8, 0},
            {6, 0, 1, 0}, {6, 3, 5, 0},
            {7, 0, 3, 0}, {7, 2, 9, 0},
            {8, 0, 5, 0}, {8, 2, 11, 0},
            {9, 0, 7, 0}, {9, 1, 10, 0}, {9, 2, 14, 0},
            {10, 2, 15, 0}, {10, 3, 9, 0},
            {11, 0, 8, 0}, {11, 1, 12, 0},
            {12, 1, 13, 1}, {12, 3, 11, 0},
            {13, 1, 14, 0}, {13, 3, 12, 0},
            {14, 0, 9, 0}, {14, 1, 15, 0}, {14, 3, 13, 1},
            {15, 0, 10, 0}, {15, 3, 14, 0}
        };
        
        QLearner ql = new QLearner(tuplas);
        ql.qLearning(16, 4, 5.0, 0.125, 0.9);
        double[][] tabla = ql.getQTable();
        for (int i = 0; i<16;i++){
            for(int j = 0; j<4; j++){
                System.out.print(tabla[i][j]);
                System.out.print(" ");
            }
            System.out.print("\n");
        }
    }
}
